package Questao;

import DisciplinaTopico.QuestaoDAOException;
import QuestaoView.QuestaoDAO;
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.LinkedList;

public class QuestaoDAOXML implements QuestaoDAO
{
    LinkedList<Questao> listaQuestoes;
    public static String NOME_DEFAULT = "questoes.xml";

    public QuestaoDAOXML() throws QuestaoDAOException
    {
        readQuestoes();
    }

//    public Questao getQuestao() throws QuestaoDAOException
//    {
//        //Todo: Especificar criterio de busca para somente uma questao
//    }

    private boolean contemQuestao(Questao questao)
    {
        for(Questao q : listaQuestoes)
            if(q.equals(questao))
                return true;

        return false;
    }

    public int getNumQuestoes()
    {
        if(listaQuestoes != null)
            return listaQuestoes.size();
        else
            return 0;
    }

    private void readQuestoes() throws QuestaoDAOException
    {
        readQuestoes(NOME_DEFAULT);
    }

    private void readQuestoes(String nomeArquivo) throws QuestaoDAOException
    {
         XMLDecoder informacoesArquivo = null;

        try
        {
            File inputFile = new File(nomeArquivo);
            if(inputFile.exists())
            {
                try
                {
                    informacoesArquivo = new XMLDecoder(new FileInputStream(nomeArquivo));
                    listaQuestoes = (LinkedList<Questao>)informacoesArquivo.readObject();
                }
                finally
                {
                    if(informacoesArquivo != null)
                        informacoesArquivo.close();
                }
            }
            else
                listaQuestoes = new LinkedList<Questao>();
        }
        catch(IOException exception)
        {
            QuestaoDAOException questaoDAOException = new QuestaoDAOException("ERRO: Não foi possível ler os dados do arquivo '" + nomeArquivo + "'.");

            questaoDAOException.setStackTrace(exception.getStackTrace());

            throw questaoDAOException;
        }
    }

    private void writeQuestoes()throws QuestaoDAOException
    {
        writeQuestoes(NOME_DEFAULT);
    }

    private void writeQuestoes(String nomeArquivo) throws QuestaoDAOException
    {
        XMLEncoder informacoesArquivo = null;

        try
        {
            try
            {
                informacoesArquivo = new XMLEncoder(new FileOutputStream(nomeArquivo));
                informacoesArquivo.writeObject(listaQuestoes);
            }
            finally
            {
                if(informacoesArquivo != null)
                    informacoesArquivo.close();
            }
        }
        catch(IOException exception)
        {
            QuestaoDAOException questaoDAOException = new QuestaoDAOException("ERRO: Não foi possível escrever todos os dados no arquivo '" + nomeArquivo + "'.");

            questaoDAOException.setStackTrace(exception.getStackTrace());

            throw questaoDAOException;
        }
    }

    public LinkedList<Questao> getQuestoes()
    {
        return listaQuestoes;
    }

    public void adiconarQuestao(Questao novaQuestao) throws QuestaoDAOException
    {
        if(contemQuestao(novaQuestao))
            throw new QuestaoDAOException("ERRO: Questao já esta cadastrada no sistema.");
        else
            listaQuestoes.add(novaQuestao);

        writeQuestoes();
    }

    public void editarQuestao(Questao questaoAlterada) throws QuestaoDAOException
    {
        if(questaoAlterada == null)
            throw new QuestaoDAOException("ERRO: A questao a ser alterada não é válida.");

        Questao questaoAntiga = null;

        for(Questao q : listaQuestoes)
        {
            if(q.getID() == questaoAlterada.getID())
                questaoAntiga = q;
        }

        if(questaoAntiga != null)
        {
            listaQuestoes.remove(questaoAntiga);
            listaQuestoes.add(questaoAlterada);
        }
        else
            throw new QuestaoDAOException("ERRO: A questao a ser alterada não esta cadastrada no banco, por favor cadastre esta questao.");
    }

    public void excluirQuestao(Questao questao) throws QuestaoDAOException
    {
        listaQuestoes.remove(questao);
    }
}
